package com.milling;

import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;

public class ModbusReadExample {

    public static void main(String[] args) {
        // 1. 配置 Modbus TCP 主站
        ModbusFactory factory = new ModbusFactory();
        IpParameters params = new IpParameters();
        params.setHost("192.168.237.178"); // 设备 IP
        params.setPort(502);            // 默认端口 502

        ModbusMaster master = factory.createTcpMaster(params, true); // TCP 长连接

        try {
            // 2. 初始化连接
            master.init();

            // 3. 读取 M100（假设为 Holding Register，地址 40100）
            int slaveId = 1; // 从站 ID
            int mAddress = 8193; // 寄存器偏移量（设备定义的 M100 对应地址 100）
            BaseLocator<Number> mLocator = BaseLocator.holdingRegister(
                    slaveId,
                    mAddress,
                    DataType.TWO_BYTE_INT_SIGNED // 数据类型（根据实际值调整）
            );
            Number mValue = master.getValue(mLocator);
            System.out.println("M100 的值: " + mValue);

            // 4. 读取 D100（假设为 Input Register，地址 30100）
            int dAddress = 100;
            BaseLocator<Number> dLocator = BaseLocator.inputRegister(
                    slaveId,
                    dAddress,
                    DataType.TWO_BYTE_INT_SIGNED
            );
            Number dValue = master.getValue(dLocator);
            System.out.println("D100 的值: " + dValue);

        } catch (ModbusInitException e) {
            System.err.println("连接失败: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("读取错误: " + e.getMessage());
        } finally {
            master.destroy(); // 关闭连接
        }
    }
}
